package XML;
import java.io.FileWriter;
import java.io.IOException;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
import modelo.improvistos.Improvisto;
import modelo.jugador.Jugador;
import modelo.tablero.Ciudad;
import modelo.vehiculos.Posicion;
import modelo.vehiculos.Vehiculo;
 
public class GeneradorXML {
		
	public GeneradorXML(Jugador unJugador , String nombreDelArchivo){

		try {
			Element raiz = nodoJugador(unJugador);
			Document doc = new Document(raiz);
			doc.setRootElement(raiz);
			doc.getRootElement().addContent(nodoVehiculo(unJugador.getMovil()));
			XMLOutputter xmlOutput = new XMLOutputter();
	 		xmlOutput.setFormat(Format.getPrettyFormat());
			xmlOutput.output(doc, new FileWriter(nombreDelArchivo));
	
		  } catch (IOException io) {
			System.out.println(io.getMessage());
		  }
		}
	public GeneradorXML(Vehiculo unVehiculo , String nombreDelArchivo){
		
		try {
	 		Element raiz = nodoVehiculo(unVehiculo);
			Document doc = new Document(raiz);
			doc.setRootElement(raiz);
			doc.getRootElement().addContent(nodoJugador(unVehiculo.getConductor()));	
			XMLOutputter xmlOutput = new XMLOutputter();
			xmlOutput.setFormat(Format.getPrettyFormat());
			xmlOutput.output(doc, new FileWriter(nombreDelArchivo));
 
		} catch (IOException io) {
			System.out.println(io.getMessage());
		  }
	}
		
	
	/*********************************************/
	public GeneradorXML(Ciudad mapa , String nombreDelArchivo){
		try {
			Element raiz = nodoMapa(mapa);
			Document doc = new Document(raiz);
			doc.setRootElement(raiz);
			XMLOutputter xmlOutput = new XMLOutputter();
			xmlOutput.setFormat(Format.getPrettyFormat());
			xmlOutput.output(doc, new FileWriter(nombreDelArchivo));
			
		} catch (IOException io) {
			System.out.println(io.getMessage());
		  }
	}
	
	
	/******************************************/
	private String tomarStringNecesario(String unString){
		int largoDelString;
		largoDelString = unString.length();
		while(unString.charAt(largoDelString -1) != '.'){
			largoDelString--;
		}
		return unString.substring(largoDelString);
		
	}
	
	/******************************************/
	private Element nodoVehiculo(Vehiculo unVehiculo){
		String tipoDeVehiculo = tomarStringNecesario(unVehiculo.getClass().toString());
 		Element vehiculo = new Element("Vehiculo");
 		
 		vehiculo.setAttribute("TipoDeVehiculo" , tipoDeVehiculo);
 		vehiculo.addContent(nodoPosicion(unVehiculo.getPosicion()));
		vehiculo.addContent(nodoMapa(unVehiculo.getCiudad()));
		return vehiculo;
	}
	
	/******************************************/
	private Element nodoMapa(Ciudad unMapa){
		Element mapa = new Element("Mapa");
		Element improvistos = new Element("Improvistos");
		mapa.setAttribute("CantidadDeFilas" , String.valueOf(unMapa.getFilas()));
		mapa.setAttribute("CantidadDeColumnas",String.valueOf(unMapa.getCols()));
		mapa.setAttribute("UbicacionLlegada",String.valueOf(unMapa.getFilMeta()));
		int cantidadDeFilasImprovistos = unMapa.getFilas()*2 -1;
		for(int i = 0 ; i < cantidadDeFilasImprovistos ; i++ ){
			for( int j = 0 ; j < unMapa.getCols(); j++){
				Improvisto unImprovisto = unMapa.getImprovisto(i, j);
				if(!tomarStringNecesario(unImprovisto.getClass().toString()).equals("Libre")){
					improvistos.addContent(nodoImprovisto(unImprovisto , i , j));
				}
			}
		}
		mapa.addContent(improvistos);
		return mapa;
	}
	
	/******************************************/
	private Element nodoPosicion(Posicion posicion){
		Element nodoPosicion = new Element("Posicion");
		nodoPosicion.setAttribute("CoordenadaX" , String.valueOf(posicion.getX()) );
		nodoPosicion.setAttribute("CoordenadaY" , String.valueOf(posicion.getY()));
		return nodoPosicion;
	}
	
	/******************************************/
	private Element nodoJugador(Jugador unJugador){
		Element nodoJugador = new Element("Jugador");
		nodoJugador.setAttribute("Nombre" , unJugador.getNombre());
		nodoJugador.setAttribute("Puntaje" , String.valueOf(unJugador.getPuntaje()));
		nodoJugador.setAttribute("MovimientosMaximos" , String.valueOf(unJugador.getMaxMov()));
		return nodoJugador;
	}
	
	/******************************************/
	private Element nodoImprovisto(Improvisto unImprovisto , int fila , int col){
		String tipoDeImprovisto = tomarStringNecesario(unImprovisto.getClass().toString());
		Element nodoImprovisto = new Element("Improvisto");
		
		nodoImprovisto.setAttribute("TipoImprovisto" , tipoDeImprovisto);
		nodoImprovisto.setAttribute("UbicadoEnFila" , String.valueOf(fila));
		nodoImprovisto.setAttribute("UbicadoEnColumna" , String.valueOf(col));
		
		return nodoImprovisto;
	}

}
